/**
 * @author
 * Júlio Zynger
 * DRE: 110092466
 */
package view;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.LinkedHashMap;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

import model.Estado;

@SuppressWarnings("serial")
public class DadosAutomato extends JFrame {

	private JPanel contentPane;
	private JTextField tfAlfabeto;
	private JTextField tfInicial;
	private DinamicJTextArea tfFinais, taEstados;
	
	private int funcao;
	private ArrayList<String> alf;
	private LinkedHashMap<String, Estado> est;
	private LinkedHashMap<String, Estado> fin;
	private Estado inicial;
	

	public DadosAutomato(int funcao) {
		this.funcao = funcao;
		
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.addWindowListener(new WindowListener() {
			@Override
			public void windowOpened(WindowEvent arg0) {}
			
			@Override
			public void windowIconified(WindowEvent arg0) {}
			
			@Override
			public void windowDeiconified(WindowEvent arg0) {}
			
			@Override
			public void windowDeactivated(WindowEvent arg0) {}
			
			@Override
			public void windowClosing(WindowEvent arg0) {}
			
			@Override
			public void windowClosed(WindowEvent arg0) {
				Inicio.frame.setState(Frame.NORMAL);
			}
			
			@Override
			public void windowActivated(WindowEvent arg0) {}
		});
		setBounds(400, 300, 550, 500);
		setResizable(false);
		if(funcao == 0) setTitle("Aceitação de Palavra");
		if(funcao == 1) setTitle("Algoritmo de Brzozowski");
		if(funcao == 2) setTitle("Algoritmo de Kleene");
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JPanel alfabeto = new JPanel();
		alfabeto.setLayout(new BorderLayout(8, 0));
		contentPane.add(alfabeto, BorderLayout.NORTH);
		
		JLabel lblAlfabeto = new JLabel("Alfabeto");
		alfabeto.add(lblAlfabeto, BorderLayout.WEST);
		
		tfAlfabeto = new JTextField();
		tfAlfabeto.setToolTipText("Separe os símbolos por vírgulas");
		alfabeto.add(tfAlfabeto, BorderLayout.CENTER);
		tfAlfabeto.setColumns(10);
		
		JPanel estados = new JPanel();
		estados.setLayout(new BorderLayout(0, 30));
		contentPane.add(estados, BorderLayout.CENTER);
		
		JPanel estadosDesc = new JPanel();
		estadosDesc.setLayout(new BorderLayout(0, 30));
		estados.add(estadosDesc, BorderLayout.CENTER);
		
		JPanel panelEstados = new JPanel();
		panelEstados.setLayout(new BorderLayout(0, 7));
		estadosDesc.add(panelEstados, BorderLayout.WEST);
		
		JLabel lblEstados = new JLabel("Estados");
		panelEstados.add(lblEstados, BorderLayout.NORTH);
		
		taEstados = new DinamicJTextArea("Digite o nome do estado e tecle enter");
		panelEstados.add(taEstados, BorderLayout.CENTER);
		
		JPanel estadosInFim = new JPanel();
		estadosInFim.setLayout(new BorderLayout(0, 3));
		estadosDesc.add(estadosInFim, BorderLayout.CENTER);
		
		JPanel estadoInicial = new JPanel();
		estadosInFim.setLayout(new BorderLayout(0, 30));
		estadosInFim.add(estadoInicial, BorderLayout.NORTH);
		
		JLabel lblEstadoInicial = new JLabel("Estado Inicial");
		lblEstadoInicial.setHorizontalAlignment(SwingConstants.CENTER);
		estadoInicial.add(lblEstadoInicial);
		
		tfInicial = new JTextField();
		tfInicial.setHorizontalAlignment(SwingConstants.CENTER);
		estadoInicial.add(tfInicial, BorderLayout.NORTH);
		tfInicial.setColumns(10);
		
		JPanel estadoFinal = new JPanel();
		estadoFinal.setLayout(new BorderLayout(0, 5));
		estadosInFim.add(estadoFinal, BorderLayout.CENTER);
		
		JLabel lblEstadoFinal = new JLabel("Estados Finais");
		estadoFinal.add(lblEstadoFinal, BorderLayout.NORTH);
		
		tfFinais = new DinamicJTextArea("Digite o nome do estado final e tecle enter");
		estadoFinal.add(tfFinais, BorderLayout.CENTER);
		
		JButton btGo = new JButton("Transições");
		btGo.setLayout(new BorderLayout(0, 30));
		contentPane.add(btGo, BorderLayout.SOUTH);
		
		alf = new ArrayList<String>();
		est = new LinkedHashMap<String, Estado>();
		fin = new LinkedHashMap<String, Estado>();
		
		
		
		
		btGo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e1) {
				boolean erroIn = false, erroFin = false;
				est.clear(); fin.clear(); alf.clear(); inicial = null; //resetar os valores antes de setar novos
				
				String alfabeto = tfAlfabeto.getText();
				String[] simbolos = alfabeto.split(",");
				for (String simbolo : simbolos) {
					simbolo = simbolo.trim();
					if(!alf.contains(simbolo)) alf.add(simbolo);
				}
				
				for (String estado : taEstados.getConteudo()) {
					estado = estado.trim();
					est.put(estado, new Estado(estado, null));
				}
				
				String estInic = tfInicial.getText();
				if (!taEstados.getConteudo().contains(estInic)){
					new Dialog("O estado inicial não está na lista de estados!");
					erroIn = true;
				}
				inicial = est.get(estInic);
				
				for (String s : tfFinais.getConteudo()) {
					if(!taEstados.getConteudo().contains(s)) erroFin = true;
				}
				if(erroFin) new Dialog("Existe estado final que não está na lista de estados!");
				
				for (String estado : tfFinais.getConteudo()) {
					estado = estado.trim();
					if(!fin.containsKey(estado)) fin.put(estado, new Estado(estado, null));
				}
				
				imprimeDados(erroIn, erroFin);
			}
		});
	}

	public void imprimeDados(boolean erroInicial, boolean erroFinais){
		/*System.out.println("Símbolos do Alfabeto:");
		for (String s : alf) {
			System.out.println(s);
		}
		System.out.println();
		
		System.out.println("Estados:");
		for (Iterator<Estado> it = est.values().iterator(); it.hasNext();) {
			Estado e = (Estado) it.next();
			System.out.println(e.getNome());
		}
		System.out.println();
		
		if(!erroInicial){
			System.out.println("Estado inicial:");
			System.out.println(inicial.getNome());
		}
		
		if(!erroFinais){
			System.out.println("Estados Finais:");
			for (Iterator<Estado> it = fin.values().iterator(); it.hasNext();) {
				Estado e = (Estado) it.next();
				System.out.println(e.getNome());
			}
		}
		*/
		if(!erroInicial && !erroFinais){
			new TabelaTransicoes(alf, est, fin, inicial, funcao);
		}
	}
	
}
